home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #49 (Oct 89) / Driver Code / RespondToRead.a < prev    next >
Text File  |  1988-01-06  |  3KB  |  136 lines

  1.                 TITLE            'Respond to completed read from pump'
  2.                 BLANKS            ON
  3.                 CASE            ON
  4.                 String            Pascal
  5.                 Machine            MC68020
  6.  
  7.                 PRINT            OFF
  8.                 INCLUDE         'Traps.a'
  9.                 INCLUDE         'ToolEqu.a'
  10.                 INCLUDE         'QuickEqu.a'
  11.                 INCLUDE         'SysEqu.a'
  12.                 INCLUDE         'SysErr.a'
  13.                 INCLUDE         'Quickdraw.inc'
  14.                 INCLUDE         'TimeEqu.a'
  15.                 INCLUDE         'PumpErrs.inc'
  16.                 LOAD            'ProgStrucMacs.d'
  17.                 LOAD            'FlowCtlMacs.d'
  18.                 PRINT            ON
  19.  
  20. ActionOffset        equ            csParam
  21. RequestOffset        equ            csParam+2
  22. InfoOffset            equ            csParam+4
  23.                 
  24. IntegerFmt            equ            0
  25. HexFmt                equ            1
  26.  
  27. Ask                    equ            0
  28. Set                    equ            1
  29.  
  30. DStore                Record        0
  31. WriteUnit            DS.W        1
  32. ReadUnit            DS.W        1
  33. TimeCount            DS.L        1
  34. KillBlock            DS.L        1
  35. KillTask            DS.L        1
  36. IncomingLength        DS.B        1
  37. IncomingString        DS.B        9
  38.                     Align        2
  39. TableOffset            equ            *
  40. TableLen            DS.W        1
  41. Table                DS.W        5
  42.                     ENDR
  43.  
  44. Export            Procedure        RespondToRead
  45.         Begin    Save=D0-D3,With=(DStore)
  46.         
  47.                 MOVE.B            IncomingString(A4),D0
  48.  
  49. *  Exclude pump misreads
  50.  
  51.                 If#    D0    EQ.B    #'!' Then.S
  52.                     MOVE.W            #PumpMisread,ioResult(A3)
  53.                     Return
  54.                 EndIf#
  55.  
  56. *  Figure out which (if any) of the pump requests we have.
  57.  
  58.                 For#    D1 = TableLen(A4) DownTo    #0 Until Table(A4,D1.W*2) EQ.B D0 Do.S
  59.                 EndF#
  60.  
  61.                 If# D1    LT.W    #0    Then.S
  62.                     MOVE.W            #PumpUnknownRequest,ioResult(A3)
  63.                     Return
  64.                 EndIf#
  65.  
  66.                 MOVE.W            D1,RequestOffset(A3)
  67.  
  68. *  Figure out what the action was
  69.  
  70.                 If#    IncomingString+1(A4)    EQ.B    #'=' Then.S
  71.                     MOVE.W            #Set,ActionOffset(A3)
  72.                 ElseIf#.S    IncomingString+1(A4)    EQ.B    #'?' Then.S
  73.                     MOVE.W            #Ask,ActionOffset(A3)
  74.                 Else#.S
  75.                     MOVE.W            #PumpUnknownAction,ioResult(A3)
  76.                     Return
  77.                 EndIf#
  78.  
  79. *  Calculate the number of remaining characters to be decoded
  80.  
  81.                 MOVE.B            IncomingLength(A4),D2
  82.                 EXT.W            D2
  83.                 SUBQ.W            #2,D2
  84.                 
  85.                 LEA                IncomingString+2(A4),A0
  86.                 
  87. *  Figure out if the request is integer or hex format, and decode the info
  88.  
  89.                 If#    Table+1(A4,D1.W*2)    EQ.B    #IntegerFmt    Then.S
  90.                 
  91.                     CLR.W            D1
  92.                 
  93.                     For# D2 DownTo #1 Do.S
  94.     
  95.                         MOVE.B            (A0)+,D0
  96.                         SUB.B            #'0',D0
  97.                         If# MI OR D0 GT.B #9 Then.S
  98.                             MOVE.W            #PumpUndecodableNumber,ioResult(A3)
  99.                             Return
  100.                         EndIf#
  101.                         EXT.W            D0
  102.                         MULU.W            #10,D1
  103.                         ADD.W            D0,D1
  104.                     EndF#
  105.                     
  106.                 Else#.S
  107.                     For# D2 DownTo #1 Do.S
  108.                     
  109.                         MOVE.B            (A0)+,D0
  110.                         EXT.W            D0
  111.                         MOVE.W            D0,D3
  112.                         
  113.                         Switch#    D0
  114.                             Case#.S '0'..'9'
  115.                                 SUB.B            #'0',D3
  116.                                 Leave#.S
  117.                             Case#.S 'A'..'F'
  118.                                 SUB.B            #'A'-10,D3
  119.                                 Leave#.S
  120.                             Default#
  121.                                 MOVE.W            #PumpUndecodableNumber,ioResult(A3)
  122.                                 Return
  123.                         EndS#
  124.                         
  125.                         LSL.W            #4,D1
  126.                         ADD.W            D3,D1
  127.                     EndF#
  128.                 EndIf#
  129.  
  130.                 MOVE.W            D1,InfoOffset(A3)
  131.                 MOVE.W            #noErr,ioResult(A3)
  132.                 
  133.                 Return
  134.                 
  135.                 ENDP
  136.                 END